# 闭包
# 利用闭包,外部函数可以返回一个函数,这个返回函数可以赋值给一个变量,变量可以在后面被继续执行调用

# 闭包可以简化程序的复杂度,提升程序的可读性
# 闭包常常和装饰器(decorator)一起使用

# 计算一个数的n次幂,返回一个闭包函数
def nth_power(exponent):
    def exponent_of(base):
        return base ** exponent

    # 返回值是exponent_of函数
    return exponent_of


if __name__ == '__main__':
    # 返回平方函数,赋值给变量square
    square = nth_power(2)
    # 返回立方函数,赋值给变量cube
    cube = nth_power(3)
    # 变量的类型为闭包函数,闭包函数会记录下外包函数的上下文,在这里是exponent变量
    print(f'square is {square}\n cube is {cube}')

    # 调用闭包函数
    print(square(2))
    print(cube(2))
